{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# tensorflow2-基础CNN网络\n",
    "![](https://adeshpande3.github.io/assets/Cover.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras import layers\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.构造数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28)   (60000,)\n",
      "(10000, 28, 28)   (10000,)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()\n",
    "print(x_train.shape, ' ', y_train.shape)\n",
    "print(x_test.shape, ' ', y_test.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.imshow(x_train[0])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = x_train.reshape((-1,28,28,1))\n",
    "x_test = x_test.reshape((-1,28,28,1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.构造网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.Sequential()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 卷积层\n",
    "![](http://cs231n.github.io/assets/cnn/depthcol.jpeg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.add(layers.Conv2D(input_shape=(x_train.shape[1], x_train.shape[2], x_train.shape[3]),\n",
    "                        filters=32, kernel_size=(3,3), strides=(1,1), padding='valid',\n",
    "                       activation='relu'))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 池化层\n",
    "![](http://cs231n.github.io/assets/cnn/maxpool.jpeg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.add(layers.MaxPool2D(pool_size=(2,2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 全连接层"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.add(layers.Flatten())\n",
    "model.add(layers.Dense(32, activation='relu'))\n",
    "# 分类层\n",
    "model.add(layers.Dense(10, activation='softmax'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.模型配置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 26, 26, 32)        320       \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 5408)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 32)                173088    \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                330       \n",
      "=================================================================\n",
      "Total params: 173,738\n",
      "Trainable params: 173,738\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             # loss=keras.losses.CategoricalCrossentropy(),  # 需要使用to_categorical\n",
    "             loss=keras.losses.SparseCategoricalCrossentropy(),\n",
    "              metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 54000 samples, validate on 6000 samples\n",
      "Epoch 1/5\n",
      "54000/54000 [==============================] - 8s 148us/sample - loss: 1.5187 - accuracy: 0.5294 - val_loss: 0.7187 - val_accuracy: 0.7482\n",
      "Epoch 2/5\n",
      "54000/54000 [==============================] - 8s 150us/sample - loss: 0.4631 - accuracy: 0.8745 - val_loss: 0.2158 - val_accuracy: 0.9463\n",
      "Epoch 3/5\n",
      "54000/54000 [==============================] - 8s 154us/sample - loss: 0.1684 - accuracy: 0.9540 - val_loss: 0.1314 - val_accuracy: 0.9642\n",
      "Epoch 4/5\n",
      "54000/54000 [==============================] - 8s 150us/sample - loss: 0.1067 - accuracy: 0.9699 - val_loss: 0.1097 - val_accuracy: 0.9722\n",
      "Epoch 5/5\n",
      "54000/54000 [==============================] - 8s 149us/sample - loss: 0.0799 - accuracy: 0.9768 - val_loss: 0.1175 - val_accuracy: 0.9712\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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x7v6Q3DfoGM/OJPa48ibjvkXtN5pZ/RzZYgkXDxeHys372XR6u18VnqQnMxUfjV5ONedO4ie6fHz7xQBhXt8qz0Atfth8EVw5uyjAzw1w+3qIqamwcMLRSU8/l4xJftrGZzTnf+49nSuHpOrOd8StxTuJyAjI4Pq6mpKS0u57bbbWL58eaefY+PGjZSWljJlyhQAVqxYwZYtW5g/f/6JFddwGPbvdKYMzvxTVI53h9u+ww088/4Onl23g/01jZw1qBd3XzWSy0b00xugEvcU7iFw0kknHVewgxPuRUVFzeE+depUpk6demIFeephX7HzwZzu2V0u2HdV1vDE2mIK/TNfLhvRlx9fNIRz8vu4XZpIxCjcA8yfP5+BAwfys5/9DIDf/OY3JCUlsWrVKvbv309jYyO//e1vmTZt2lHft2PHDq666io2b97M+PHjefLJJxk1yjk3zqRJk3jggQfw+XzMmzePuro60tPTefrppykoKODuu++mtraWtWvXcuedd1JbW0tRUREPP/wwO3bs4JZbbqGiooKcnByefvppBg0axE033USPHj0oKipi79693H///UyfPt0pxudxgt1ayBoC+76O6DF00+Y9VSxcvZ2Vn5aRmGC4enQucycOZmg/fcpXup7oDfc358PeT0P7nP1Phyvva/PhmTNncvvttzeHe2FhIW+99Ra33XYbPXr0oKKigvHjxzN16tQ2P4gyc+ZMCgsLWbBgAWVlZZSVlTF27FgOHjzIe++9R1JSEn/961+56667ePHFF7n33nubwxzgj3/8Y/Nz/eIXv2DOnDnMmTOHp556ittuu41XXnkFgLKyMtauXcsXX3zB1KlTnXC3PifMPfVOsCenhejARS9rLWu3VbBodTFrtzkzX269cDA3Tyigf8/4//eLtCV6w90FY8aM4dtvv6W0tJTy8nJ69+5N//79+eUvf8maNWtISEhgz549fPPNN/Tv37/V55gxYwZXXHEFCxYsoLCwsLmjrqqqYs6cOWzduhVjDI2NHV8FYN26dc2nA77xxhu54447mh+7+uqrSUhIYOTIkXzzzTdOp35gl/PhoV4nQ2p8d6ser483Pi1j0epitpQdpG9mKvOvdGa+9EjTzBeR6A33djrscPr+97/P8uXL2bt3LzNnzmTx4sWUl5ezYcMGkpOTyc/Pb/VUv01yc3PJyspi06ZN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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'valivation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 1s 62us/sample - loss: 0.1191 - accuracy: 0.9667\n"
     ]
    }
   ],
   "source": [
    "res = model.evaluate(x_test, y_test)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
